iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Software Development

C++超級菜鳥也可以懂的物件導向攻略系列 第 17

Day17 C++ Reference & Pointer 指標

  • 分享至 

  • xImage
  •  

為什麼要用指標pointer?

這很像員工編號,雖然大家都有名字但用員工編號搜尋員工有時候就是比較快。
variable之於記憶體位址,如同名字之於員工編號。

我們可以跳過variable名稱用位址取用該資料。

當我們declare variable的時候,電腦會依配置在記憶體空出一個空間以供程式使用。

Variable跟記憶體關係
就是跟電腦說“嘿,幫我在記憶體那邊空出一些空間,我要放東西,謝謝。”
例如打int age = 5;,等於跟電腦說,哈囉,幫我空出一個4 bytes的地方,這個空間叫age,裡面放5這個數字。
如果還不知道要放什麼,也可以打int age;,跟電腦說我還不知道放什麼,請幫我清出一個4 bytes空白叫做age的空間,等等再決定放什麼。
引用自Day 12 - C++ 物件導向1 - 類別Class,那個book b1是什麼? object又是什麼?

而之前沒有提到的是,電腦要怎麼找到這段記憶體呢?
在記憶體裡面有一個地址稱為記憶體位址,我們的variable name並不是實際的記憶體所在的地方,只是程式裡讓我們自己知道的標籤,例如分類箱上面寫“冬衣”,放在儲藏間右邊第二個貴子第二層,冬衣的標籤就是variable,那個箱子擺放的位子就是記憶體位址

這是C++的招牌,跟別人Java與Python都不一樣最大的特色。
優化記憶體空間、優化code效率


  • 當我們想要知道地址在哪可以用 & variable_name;
using namespace std;
int main(){
    int num = 5;
    cout << "這是vairable num: " << num << endl;
    cout << “這是variable num的記憶體位址: ”<< &num;
}

然後,我們還能多元化的使用 &*把這個記憶體位址送往不同的variable name,注意是記憶體位址不是裡面裝的東西。就不用每次都加上&。
比方說:

    string name = Mike;
    string* firstname = &name; //這個firstname就叫做pointer name
    cout <<"Name: " << name << endl;
    cout << firstname; 
    //產出結果:Name: Mike
     //       Mike的記憶體位址

裝記憶體位址的variable叫做指標名稱pointer name


Indirect Operator間接運算(aka如何取得variable的值)

上面解釋了如何連接並把variable裝進記憶體位址。
現在要來看要從記憶體位址找出存放在這個箱子裡的到底是什麼東西,可以這樣用:
* 指標名稱pointer name;

    string name = Mike;
    string* firstname = &name;
    cout << *firstname; 
    //產出結果: Mike
     //       輸出variable string name裡面的值

也可以反過來,把資料裝進去喔!

    string *firstname;
    *firstname = "Mike";

但要注意:不能這樣裝 string firstname = "Mike";,一定要上面那樣

Reference: Tutorialspoint, geeksforgeeks


上一篇
Day16 - C++物件導向 int\string轉換() 應用和刷題
下一篇
Day18 C++物件導向5 - Encapsulation封裝
系列文
C++超級菜鳥也可以懂的物件導向攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言